/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import controller.Cliente;
import controller.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Alcivando
 */
public class ClienteDAO {

    Cliente cliente = new Cliente();
    private Connection connection;
    private Conexao conexao;

    public ClienteDAO() throws SQLException {
        this.connection = conexao.getConnection();

    }

    /**
     * Este método retorna o proximo código do cliente que é pegado no BD.
     */
    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codCliente\") from clientes;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    /**
     * Este método adiciona no BD os dados de um cliente.
     */
    public void adiciona(Cliente cliente) throws SQLException {

        // cria uma lista onde será armazenado o próximo codigo
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codCliente\") from clientes;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        //adiciona o codigo ao proximo cliente a ser inserido
        cliente.setCodCliente(codigo.get(0));

        // insere os dados do cliente com a conexao para o banco de dados.
        String sql = "insert into clientes values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, cliente.getCodCliente());
        stmt.setString(2, cliente.getNome());
        stmt.setString(3, cliente.getCpf());
        stmt.setString(4, cliente.getTamanho());
        stmt.setString(5, cliente.getRua());
        stmt.setInt(6, cliente.getNumero());
        stmt.setString(7, cliente.getBairro());
        stmt.setString(8, cliente.getCidade());
        stmt.setString(9, cliente.getTelefone());
        stmt.setString(10, cliente.getAniversario());
        stmt.setString(11, cliente.getObs());
        stmt.setString(12, cliente.getUf());
        stmt.setString(13, cliente.getComplemento());
        stmt.setInt(14, cliente.getValorConta());
        stmt.setString(15, cliente.getCep());
        // busca os campos preenchidos na classe de Clientes.

        stmt.execute();
        JOptionPane.showMessageDialog(null, "O Cliente foi salvo com sucesso!", "Cadastro Concluído", 1);
        stmt.close();
        // executa e finaliza o processo de adicionar.*/
    }

    /**
     * Este método retorna a lista de Clientes Cadastrados no Banco de Dados.
     */
    public ArrayList<Cliente> retornaTodosClientes() {
        Statement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {

            String sql = "SELECT * FROM clientes";
            comando = connection.createStatement();
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setCidade(rs.getString("observacoes"));
                c.setTelefone(rs.getString("uf"));
                c.setCidade(rs.getString("complemento"));
                c.setTelefone(rs.getString("valorConta"));
                c.setCep(rs.getString("cep"));

                listaCliente.add(c);


            }
            comando.close();

            return listaCliente;

        } catch (SQLException ex) {
            return null;
        }
    }


    /**
     * Este método adiciona um valor na conta de um cliente.
     */
    public void adicionarValorConta(int codCliente, Double valor) {
        try {
            String sql = "update clientes set \"valorConta\" = \"valorConta\" + ? where \"codCliente\" = ?;";

            PreparedStatement stmt = connection.prepareStatement(sql);

            stmt.setDouble(1, valor);
            stmt.setInt(2, codCliente);
            // busca os campos preenchidos na classe de Clientes.

            stmt.execute();
            stmt.close();

        } catch (Exception ex) {
        }

    }

    /**
     * Este método deleta do BD o Cliente informado.
     */
    public void remover(Cliente cliente) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM clientes WHERE \"codCliente\"=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cliente.getCodCliente());
            comando.execute();
            JOptionPane.showMessageDialog(null, "O Cliente foi removido com sucesso!", "Remoção Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }


    /**
     * Este método atualiza no BD dados de um Cliente.
     */

    public void atualizar(Cliente cliente) {
        PreparedStatement comando;
        try {

            String sql = "UPDATE clientes SET nome = ?, cpf = ?, tamanho = ?, aniversario = ?, rua = ?, numero = ?, bairro= ?, cidade = ?, telefone = ?, observacoes = ?,\"UF\" = ?, complemento = ?, \"valorConta\" = ?, cep = ? WHERE \"codCliente\" = " + cliente.getCodCliente() + ";";

            comando = connection.prepareStatement(sql);
            comando.setString(1, cliente.getNome());
            comando.setString(2, cliente.getCpf());
            comando.setString(3, cliente.getTamanho());
            comando.setString(4, cliente.getAniversario());
            comando.setString(5, cliente.getRua());
            comando.setInt(6, cliente.getNumero());
            comando.setString(7, cliente.getBairro());
            comando.setString(8, cliente.getCidade());
            comando.setString(9, cliente.getTelefone());
            comando.setString(10, cliente.getObs());
            comando.setString(11, cliente.getUf());
            comando.setString(12, cliente.getComplemento());
            comando.setInt(13, cliente.getValorConta());
            comando.setString(14, cliente.getCep());



            comando.executeUpdate();
            JOptionPane.showMessageDialog(null, "O Cliente foi alterado com sucesso!", "Alteração Concluída", 1);

            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
    /**
     * Este método retorna a lista de Clientes Cadastrados no Banco de Dados que tem o código ou parte dele igual ao numero dado.  
     */

    public ArrayList<Cliente> retornaClientePorCod(int cod) {

        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            String sql = "SELECT * FROM clientes WHERE \"codCliente\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cod);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setObs(rs.getString("observacoes"));
                c.setUf(rs.getString("uf"));
                c.setComplemento(rs.getString("complemento"));
                c.setValorConta(rs.getDouble("valorConta"));
                c.setCep(rs.getString("cep"));
                listaCliente.add(c);
            }

            comando.close();

            return listaCliente;

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    /**
     * Este método retorna a lista de Clientes Cadastrados no Banco de Dados que tem o nome ou parte dele igual ao nome dado.  
     */
    
    public ArrayList<Cliente> retornaClientePorNome(String nome) {

        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            String sql = "SELECT * FROM clientes WHERE nome LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setObs(rs.getString("observacoes"));
                c.setUf(rs.getString("uf"));
                c.setComplemento(rs.getString("complemento"));
                c.setValorConta(rs.getDouble("valorConta"));
                c.setCep(rs.getString("cep"));

                listaCliente.add(c);
            }

            comando.close();

            return listaCliente;


        } catch (Exception sqle) {
            return null;
        }
    }
    
    /**
     * Este método retorna a lista de Clientes Cadastrados no Banco de Dados que tem o cpf ou parte dele igual ao cpf dado.  
     */

    public ArrayList<Cliente> retornaClientePorCpf(String cpf) {

        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();


        try {
            String sql = "SELECT * FROM clientes WHERE cpf LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, cpf + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setObs(rs.getString("observacoes"));
                c.setUf(rs.getString("uf"));
                c.setComplemento(rs.getString("complemento"));
                c.setValorConta(rs.getDouble("valorConta"));
                c.setCep(rs.getString("cep"));
                listaCliente.add(c);
            }

            comando.close();

            return listaCliente;

        } catch (Exception sqle) {
            return null;
        }
    }
    
    /**
     * Este método retorna o Cliente Cadastrado no Banco de Dados que tem o código igual ao numero dado.  
     */

    public Cliente retornaClientePorCodigo(int cod) {
        PreparedStatement comando;

        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            String sql = "SELECT * FROM clientes WHERE \"codCliente\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cod);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setObs(rs.getString("observacoes"));
                c.setUf(rs.getString("uf"));
                c.setComplemento(rs.getString("complemento"));
                c.setValorConta(rs.getDouble("valorConta"));
                c.setCep(rs.getString("cep"));

                listaCliente.add(c);
            }

            comando.close();

            return listaCliente.get(0);

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    
    /**
     * Este método retorna a lista de Clientes Cadastrados no Banco de Dados que fazem aniversário na data informada.  
     */

    public ArrayList<Cliente> retornaAniversariante(String data) {

        PreparedStatement comando;
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();

        try {
            String sql = "SELECT * FROM clientes WHERE aniversario = ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, data);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Cliente c = new Cliente();

                c.setCodCliente(rs.getInt("codCliente"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setTamanho(rs.getString("tamanho"));
                c.setAniversario(rs.getString("aniversario"));
                c.setRua(rs.getString("rua"));
                c.setNumero(rs.getInt("numero"));
                c.setBairro(rs.getString("bairro"));
                c.setCidade(rs.getString("cidade"));
                c.setTelefone(rs.getString("telefone"));
                c.setObs(rs.getString("observacoes"));
                c.setUf(rs.getString("uf"));
                c.setComplemento(rs.getString("complemento"));
                c.setValorConta(rs.getDouble("valorConta"));
                c.setCep(rs.getString("cep"));

                listaCliente.add(c);


            }

            comando.close();

            return listaCliente;

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    
    /**
     * Este método desconta um valor da conta de um cliente
     */

    public void descontaConta(Double valor, Cliente c, String vencimento) {

        PreparedStatement comando;
        PreparedStatement comando2;

        String[] data = vencimento.split("/");

        int dia = Integer.parseInt(data[0].toString());
        int mes = Integer.parseInt(data[1].toString()) + 1;
        int ano = Integer.parseInt(data[2].toString());

        try {

            String sql = "update clientes set \"valorConta\" = \"valorConta\" - ? where clientes.\"codCliente\" = ?;";

            comando = connection.prepareStatement(sql);
            comando.setDouble(1, valor);
            comando.setInt(2, c.getCodCliente());

            comando.execute();

            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

    }
}
